#include "W25Q64.h"
#define viod void
void W25Q64_Init(void) {
    SSPI_Init();
}

// 获取设备ID
void W25Q64_ReadID(uint8_t *MID, uint16_t *DID) {
    SSPI_Start(); // 通信开始

    SSPI_SwapByte(W25Q64_JEDEC_ID);
    *MID = SSPI_SwapByte(W25Q64_DUMMY_BYTE);
    *DID = SSPI_SwapByte(W25Q64_DUMMY_BYTE);
    *DID <<= 8;
    *DID |= SSPI_SwapByte(W25Q64_DUMMY_BYTE);
    SSPI_Stop(); // 通信结束
}

// 写使能
static void W25Q64_WriteEnable(void) {
    SSPI_Start(); // 通信开始
    SSPI_SwapByte(W25Q64_WRITE_ENABLE);
    SSPI_Stop(); // 通信结束
}

// ，忙等
static void W25Q64_WaitBusy(void) {
    uint32_t Timeout = 100000;
    SSPI_Start(); // 通信开始
    SSPI_SwapByte(W25Q64_READ_STATUS_REGISTER_1);

    while ((SSPI_SwapByte(W25Q64_DUMMY_BYTE) & W25Q64_BUSY) == W25Q64_BUSY) {
        Timeout--;

        if (Timeout == 0) {
            break;
        }
    }

    SSPI_Stop(); // 通信结束
}

// 提取一个发送24位地址的函数
static void W25Q64_SendAddress(uint32_t Address) {
    SSPI_SwapByte((uint8_t)Address >> 16);
    SSPI_SwapByte((uint8_t)Address >> 8);
    SSPI_SwapByte((uint8_t)Address);
}

// 写一页数据
void W25Q64_PageProgram(uint32_t Address, uint8_t *DataArry, uint16_t Length) {
    // uint32_t，第24存的是地址，要求是从23-16位，15-8位7到0位开始存
    W25Q64_WriteEnable();//写入数据之前，需要写使能，仅对之后一条时序有效
    SSPI_Start(); // 通信开始
    SSPI_SwapByte(W25Q64_PAGE_PROGRAM);
    W25Q64_SendAddress(Address);

    for (uint16_t i = 0; i < Length; i++) {
        SSPI_SwapByte(DataArry[i]);
    }

    SSPI_Stop(); // 通信结束
    W25Q64_WaitBusy();
}

// 扇区擦除
void W25Q64_SectorErase(uint32_t Address) {
    // uint32_t，第24存的是地址，要求是从23-16位，15-8位7到0位开始存
    W25Q64_WriteEnable();//写入数据之前，需要写使能，仅对之后一条时序有效
    SSPI_Start(); // 通信开始
    SSPI_SwapByte(W25Q64_SECTOR_ERASE_4KB);
    W25Q64_SendAddress(Address);
    SSPI_Stop(); // 通信结束
    W25Q64_WaitBusy();
}

// 读数据
void W25Q64_ReadData(int32_t Address, uint8_t *DataArry, uint32_t Length) {
    // uint32_t，第24存的是地址，要求是从23-16位，15-8位7到0位开始存
    SSPI_Start(); // 通信开始
    SSPI_SwapByte(W25Q64_READ_DATA);
    W25Q64_SendAddress(Address);

    for (uint32_t i = 0; i < Length; i++) {
        //每次读取后，存储器芯片内容自动自增
        W25Q64_WaitBusy();
        DataArry[i] = SSPI_SwapByte(W25Q64_DUMMY_BYTE);
    }

}

//// 读数据
//uint8_t W25Q64_Read_Byte(uint32_t ReadAddr) {
//    W25Q64_WaitBusy();
//    SSPI_Start(); // 通信开始
//    SSPI_SwapByte(W25Q64_READ_DATA);
//    W25Q64_SendAddress(ReadAddr);
//    DataArry[i] = SSPI_SwapByte(W25Q64_DUMMY_BYTE);
//    uint8_t Data = SPI1_ReadWriteByte(0xFF);  // 读前面发送的地址中的: 数据
//    SSPI_Stop(); //通信结束
//    return Data;
//}